<?php
namespace Cashier;

class Sign
{
    /**
     * 排序
     * @param $para
     * @return mixed
     */
    function argSort($para)
    {
        ksort($para);
        reset($para);
        return $para;
    }

    /**
     * 去除参数中的签名参数和空参数
     * @param $para
     * @return array
     */
    function paraFilter($para)
    {
        $para_filter = array();
        while (list ($key, $val) = each($para)) {
            if ($key == "sign" || $key == "signtype" || $val == "") {
                continue;
            } else {
                $para_filter[$key] = $para[$key];
            }
        }

        return $para_filter;
    }

    /**
     * 签名字符串
     */
    function md5Sign($prestr, $key)
    {
        $prestr = $prestr . $key;
        return strtoupper(md5($prestr));
    }

    /**
     * 验证md5签名
     */
    function md5Verify($prestr, $sign, $key)
    {
        $prestr = $prestr . $key;
        $mysgin = strtoupper(md5($prestr));
        if ($mysgin == $sign) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 把数组所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串
     */
    function createLinkstring($para)
    {
        $arg = "";
        while (list ($key, $val) = each($para)) {
            $arg .= $key . "=" . $val . "&";
        }
        // 去掉最后一个&字符
        $arg = substr($arg, 0, count($arg) - 2);

        // 如果存在转义字符，那么去掉转义
        if (get_magic_quotes_gpc()) {
            $arg = stripslashes($arg);
        }

        return $arg;
    }

    /**
     * 把数组所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串，并对字符串做urlencode编码
     */
    function createLinkstringUrlencode($para)
    {
        $arg = "";
        while (list ($key, $val) = each($para)) {
            $arg .= $key . "=" . urlencode($val) . "&";
        }
        // 去掉最后一个&字符
        $arg = substr($arg, 0, count($arg) - 2);

        // 如果存在转义字符，那么去掉转义
        if (get_magic_quotes_gpc()) {
            $arg = stripslashes($arg);
        }

        return $arg;
    }

    /**
     * 验证通知
     * @param $salt
     * @return bool
     */
    function verifyNotify($salt)
    {
        if (empty($_GET) or empty($_GET['sign']) or empty($_GET['signtype'])) {
            return false;
        }

        // 除去待签名参数数组中的空值和签名参数
        $signParams = $this->paraFilter($_GET);
        $signParams = $this->argSort($signParams);

        // 把数组所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串
        $linkStr = $this->createLinkstring($signParams);

        return $this->md5Verify($linkStr, $_GET['sign'], $salt);
    }
}


// end Sign
